<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
    <script >
        // 声明变量
        let a;
        let b,c,d;
        let e = 100;
        let f = 521,g='l',h=[];

        // 变量不能重复声明
        let star = "周几轮"
        // let star = "周" error

        // 块级作用域、全局，函数，eval
        /*
        在之前的版本，也就是es5之前，只有var一种变量的声明，
        在var的声明下，是不存在块作用域的，
        即，对于定义在 if 块，循环块，自定义代码块之类的 由var
        声明的变量，其实和定义在外边是没有区别的。
        但是对于let的引入，块中成为他独有的命名空间。
        */
        {
            let girl = "sss"
        }

        console.log(girl);//undefined

        //  不存在变量提升
        console.log(st);
        let st = "123";

        // 不影响作用域链
        {
            let school  = "23";
            function fn(){
                console.log(school);
            }
            // 当发现自己的作用域不存在，也会从外边查找。
            fu();
        }


        /*
         一个小案例来理解let
        */
       let obj =[{},{},{},{}];
       for(var i = 0;i<4;i++){
            obj[i].test = function(){
                console.log(i);
            }
       }
       // 块级作用域的区别
       // 一直都是 4
       for(let i = 0;i<4;i++){
            obj[i].test = function(){
                console.log(i);
            }
       }
       // 正常打印
    </script>
</body>

</html>